package hyl.base.kv;

import org.iq80.leveldb.Options;
import hyl.core.MyFun;
import hyl.core.conf.MyConfig;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;

public class KVConfigs {

	public static final int I模式_单机 = 1;
	public static final int I模式_主从 = 2;
	public static final int I模式_集群 = 3;
	//单例模式
	public static KVConfigs _conf;
	Map<String, ConfigItem> _cfgmap = new HashMap<>();

	// 实例化
	public static KVConfigs getInstance() {
		if (_conf == null) {
			try {
				_conf = new KVConfigs();
	
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return _conf;
	}

	/**
	 * 从主配置文件中取出别名=? kvmap
	 * 
	 * @param 别名
	 * @return
	 */
	public static ConfigItem getConf(String 别名) {
		KVConfigs conf = KVConfigs.getInstance();	
		return conf._cfgmap.get(别名);
	}

	public static Options ini缓存大小(int 缓存大小) {
		Options options = new Options();
		options.createIfMissing(true);
		// options.compressionType(CompressionType.SNAPPY);
		if (缓存大小 > 0)
			options.writeBufferSize(缓存大小); // 800MB cache for write buffer
		// options.cacheSize(0);
		return options;
	}

	/*
	 * 从ini配置文件创建kv, 只能是项目文件夹下的库文件
	 * 
	 * public static ConfigItem getConf(String 指定配置文件,int 自定义缓存大小) { Map<String,
	 * String> pp = MyConfig.loadIni(指定配置文件, MyCharset._UTF8); if (自定义缓存大小==0)
	 * 自定义缓存大小=MyFun.str2int(pp.get("缓存大小")); return new ConfigItem(ini(自定义缓存大小),
	 * pp.get("路径"));
	 * 
	 * }
	 */

	public static KVDb getKV(String 别名) {
		ConfigItem cfgConfig = KVConfigs.getConf(别名);
		return KVDb.getInstance(cfgConfig._path, null, cfgConfig._options);
	}

	public static KVDb getKV(String 别名, String 类路径) {
		ConfigItem cfgConfig = KVConfigs.getConf(别名);
		return KVDb.getInstance(cfgConfig._path, 类路径, cfgConfig._options);
	}

	public static KVDb getKV(String 库文件, String 类路径, int 自定义缓存大小) {
		return KVDb.getInstance(库文件, 类路径, ini缓存大小(自定义缓存大小));
	}

	// byte[] host;
	// 64M
	int l缓存大小 = 67108864;
	// String s密钥;
	// String[] s备份主机;
	// int i本机端口 = 0;

	InetSocketAddress ipport;

//	public byte[] getHost() {
//		return host;
//	}

	public KVConfigs() throws IOException {
		Map<String, Object> pp = MyConfig.getConfOfKv();
		setConfig(pp);
		System.out.println("kv配置已加载..");
	}

	/**
	 * 所有的kv 集成在一个配置文件
	 * 
	 * @param pp
	 * @throws IOException
	 */
	public void setConfig(Map<String, Object> pp) throws IOException {
		// Map<String, Object> pp = MyConfig.getConfOfKv();

		// host = MyFun.u8str2Bytes(MyFun.obj2Str(pp.get("主机名")));

		// i本机端口 = MyFun.str2int(MyFun.obj2Str(pp.get("本机端口")));

		// s备份主机 = MyFun.split(MyFun.obj2Str(pp.get("备份主机")), ",");

		// set备份主机(s备份主机);

		l缓存大小 = MyFun.obj2Int(pp.get("缓存大小"), 67108864);// 默认64Mb

		// s密钥 = MyFun.obj2Str(pp.get("密钥"));

		@SuppressWarnings("unchecked")
		Map<String, Map<String, String>> map = (Map<String, Map<String, String>>) pp.get("数据库");
		for (Map.Entry<String, Map<String, String>> mp : map.entrySet()) {
			String flag = mp.getValue().get("启用");
			if (!flag.equals("是"))
				continue;
			Options options = new Options();
			options.createIfMissing(true);
			// options.compressionType(CompressionType.SNAPPY);
			options.writeBufferSize(l缓存大小);
			Map<String, String> pp2 = mp.getValue();
			String 路径 = pp2.get("路径");
			if (路径.charAt(0) == '.')
				路径 = 路径.replace(".", System.getProperty("user.dir"));
			ConfigItem cfg = new ConfigItem(options, 路径);
			// kvm.setS参数(pp2.get("参数"));
			// kvm.setI模式(MyFun.str2int(pp2.get("模式"), I模式_单机));
			_cfgmap.put(mp.getKey(), cfg);
		}
	}

}
